001    /*
002     * Copyright (c) 2005 Stephen J. McConnell
003     *
004     * Licensed  under the  Apache License,  Version 2.0  (the "License");
005     * you may not use  this file  except in  compliance with the License.
006     * You may obtain a copy of the License at
007     *
008     *   http://www.apache.org/licenses/LICENSE-2.0
009     *
010     * Unless required by applicable law or agreed to in writing, software
011     * distributed  under the  License is distributed on an "AS IS" BASIS,
012     * WITHOUT  WARRANTIES OR CONDITIONS  OF ANY KIND, either  express  or
013     * implied.
014     *
015     * See the License for the specific language governing permissions and
016     * limitations under the License.
017     */
018    
019    package net.dpml.metro.tools;
020    
021    import net.dpml.state.DefaultTransition;
022    import net.dpml.state.DefaultOperation;
023    
024    import org.apache.tools.ant.BuildException;
025    
026    /**
027     * Utility datatype supporting a Transition instance construction.
028     *
029     * @author <a href="http://www.dpml.net">Digital Product Meta Library</a>
030     * @version 1.1.0
031     */
032    public class TransitionDataType
033    {
034        private String m_name;
035        private String m_target;
036        private OperationDataType m_operation;
037        
038       /**
039        * Set the operation name.
040        * @param name the operation name
041        */
042        public void setName( final String name )
043        {
044            if( null == name )
045            {
046                throw new NullPointerException( "name" );
047            }
048            m_name = name;
049        }
050        
051       /**
052        * Set the transition target.
053        * @param target the relative address of the target state
054        */
055        public void setTarget( final String target )
056        {
057            if( null == target )
058            {
059                throw new NullPointerException( "target" );
060            }
061            m_target = target;
062        }
063        
064       /**
065        * Add an operation to the transition.
066        * @return the operation datatype
067        */
068        public OperationDataType createOperation()
069        {
070            if( null != m_operation )
071            {
072                final String error = 
073                  "Transition is attempting to declare more than one operation.";
074                throw new IllegalStateException( error );
075            }
076            m_operation = new OperationDataType();
077            return m_operation;
078        }
079        
080        DefaultTransition getTransition()
081        {
082            String name = getName();
083            String target = getTargetName();
084            if( null == m_operation )
085            {
086                return new DefaultTransition( name, target, null );
087            }
088            else
089            {
090                DefaultOperation operation = m_operation.getOperation();
091                return new DefaultTransition( name, target, operation );
092            }
093        }
094        
095        String getName()
096        {
097            if( null != m_name )
098            {
099                return m_name;
100            }
101            else
102            {
103                throw new BuildException( "Missing transition name attribute." );
104            }
105        }
106    
107        String getTargetName()
108        {
109            if( null != m_target )
110            {
111                return m_target;
112            }
113            else
114            {
115                throw new BuildException( "Missing transition target attribute." );
116            }
117        }
118    }